/*
* Need C++ 14 standard.
* g++ -std=c++14 xxx.cpp
*/
#include <iostream>
#include <memory>

// 枚举网格实体
// 应该不用将这个enum放入MeshEntity类
// 不止在MeshEntity中构造
// 这里应该也用命名空间包一层，区分框架
enum class MeshEntityEnum {
    Cell,
    Face
};

// 接口类
class EntityTypeInterface {
public:
    virtual void print() const = 0;
    virtual ~EntityTypeInterface() = default;
};


// 运行时表示类
// 这里能不能用命令空间来包一层？
// 区分JASMIN和JUSMAR框架
class EntityType {
public:
    // 使用 std::unique_ptr 意味着 EntityType 类拥有了对 EntityTypeInterface 类型对象的所有权。
    // 当 EntityType 对象被销毁时，它将负责释放所拥有的 EntityTypeInterface 对象，从而避免了内存泄漏。
    EntityType(EntityTypeInterface* entity) : entity_(std::move(entity)) {}

    void print() const {
        entity_->print();
    }

private:
    // std::unique_ptr<EntityTypeInterface> entity_;
    EntityTypeInterface* entity_;
};

// 实现类1 - 网格微元
class MeshEntity : public EntityTypeInterface {
public:
    MeshEntity(int value) : value_(value) {}


    MeshEntity(MeshEntityEnum meshtype, int value) : value_(value) {
        if (meshtype != MeshEntityEnum::Cell) {
            throw std::invalid_argument("Invalid entity type for MeshEntity");
        }
    }

    void print() const override {
        std::cout << "Grid Entity: " << value_ << std::endl;
    }

private:
    int value_;
    EntityTypeInterface* ptr_;

};

// 实现类2 - 附属微元
class AttachEntity : public EntityTypeInterface {
public:
    AttachEntity(int value) : value_(value) {}

    void print() const override {
        std::cout << "Attachment Entity: " << value_ << std::endl;
    }

private:
    int value_;
    EntityTypeInterface* ptr_;

};

int main() {
    EntityType entity1(MeshEntity mesh(11));
    // EntityType entity2(10);


    entity1.print();
    // entity2.print();

    return 0;
}
